home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / net / bind-contrib.tar.gz / bind-contrib.tar / contrib / misc / bstat next >
Encoding:
Text File  |  1996-10-25  |  15.1 KB  |  494 lines

  1. Delivery-Date: Sun, 21 May 1995 12:16:32 -0700
  2. Return-Path: pma@sdd.hp.com
  3. Received: by gw.home.vix.com id AA14412; Sun, 21 May 95 12:16:31 -0700
  4. Received: from hpsdleh6.sdd.hp.com by hpsdlo.sdd.hp.com with ESMTP
  5.     ($Revision: 8.2 $/15.5+IOS 3.21+sdd) id AA097123789; Sun, 21 May 1995 12:16:30 -0700
  6. Received: from localhost by hpsdleh6.sdd.hp.com with SMTP
  7.     (1.37.109.16/15.5+IOS 3.21+sdd) id AA189723789; Sun, 21 May 1995 12:16:29 -0700
  8. Message-Id: <199505211916.AA189723789@hpsdleh6.sdd.hp.com>
  9. To: paul@vix.com
  10. Subject: new stats program - ignore earlier
  11. Date: Sun, 21 May 1995 12:16:29 -0700
  12. From: Paul Albitz <pma@sdd.hp.com>
  13.  
  14.  
  15. I added -a (show all stats) to the previous one I sent you 
  16. and that lead to something interesting ...
  17.  
  18. This is the top of the stats you sent me.
  19. You've probably already seen this, but the early entries
  20. are weird.  It looks like the IP addr for logging purposes 
  21. gets messed up or the IP addr really *is* messed up.
  22.  
  23. 0.0.0.0        
  24.            748 responses we had to forward
  25.             31 responses sent to them
  26.           1730 responses forwarded to them
  27.            829 server failure responses sent to them
  28.             31 queries answered from our cache
  29.              3 negative responses sent to them
  30. 0.4.8.84    
  31.              1 inverse query
  32.             23 system queries sent to them
  33.             19 queries forwarded to them
  34.              1 response forwarded to them
  35.              7 duplicate queries sent to them
  36. 0.4.130.195    
  37.              1 query forwarded to them
  38.              3 duplicate queries sent to them
  39. 2.78.83.4    
  40.             10 queries forwarded to them
  41. 3.21.4.133    
  42.             11 duplicate queries sent to them
  43. 3.21.24.103    
  44.              5 queries forwarded to them
  45.              4 responses forwarded to them
  46.              2 duplicate queries sent to them
  47. 3.21.24.104    
  48.              1 query forwarded to them
  49. 10.0.0.30    
  50.             72 queries
  51.              4 queries we had to forward
  52.              1 response we had to forward
  53.             68 responses sent to them
  54.              4 responses forwarded to them
  55.             72 queries from a resolver
  56.             14 queries answered from our cache
  57.              3 negative responses sent to them
  58.  
  59. paul
  60. ============
  61. #!/usr/bin/perl
  62.  
  63. #NAME
  64. #
  65. #    bstat - BIND statistics tool
  66. #    $Date: 1996/10/25 17:07:54 $
  67. #
  68. #SYNOPSIS
  69. #
  70. #    bstat [-aeilnuz] -f <statistics-file> -t <threshold>
  71. #
  72. #       -a show all stats
  73. #       -e show any errors
  74. #       -f use <statistics-file> instead of 
  75. #          /usr/tmp/named.stats or /var/tmp/named.stats
  76. #       -i report who sent us an inverse query
  77. #       -l report who sent us lame delegations
  78. #       -n don't look up names for IP addresses
  79. #       -t only report counts above <threshold>
  80. #       -u report which machines use this name server
  81. #       -z report who requested a zone transfer
  82.  
  83. require 'sys/socket.ph';
  84.  
  85. # Various defaults
  86. $All_stats = 0;
  87. $By_name = 1;
  88. $Error_cases = 0;
  89. $Inverse_query = 0;
  90. $Lame_delegations = 0;
  91. $Stats_file1 = "/usr/tmp/named.stats";
  92. $Stats_file2 = "/var/tmp/named.stats";
  93. $Threshold = 0;
  94. $Uses_this_server = 0;
  95. $Requested_zone_transfer = 0;
  96.  
  97. if($#ARGV < 0){
  98.     printf STDERR "Usage: bstat [-aeilnuz] -f <statistics-file> -t <threshold>\n";
  99.     printf STDERR "             -a show all stats\n";
  100.     printf STDERR "             -e show any errors\n";
  101.     printf STDERR "             -f use <statistics-file> instead of \n";
  102.     printf STDERR "                /usr/tmp/named.stats or /var/tmp/named.stats\n";
  103.     printf STDERR "             -i report who sent us an inverse query\n";
  104.     printf STDERR "             -l report who sent us lame delegations\n";
  105.     printf STDERR "             -n don't look up names for IP addresses\n";
  106.     printf STDERR "             -t only report counts above <threshold>\n";
  107.     printf STDERR "             -u report which machines use this name server\n";
  108.     printf STDERR "             -z report who requested a zone transfer\n";
  109.     exit;
  110. }
  111.  
  112. &PARSEARGS(@ARGV);
  113.  
  114. open(STATS, $Stats_file1) || open(STATS, $Stats_file2) || die "can not open $Stats_file1 or $Stats_file2";
  115.  
  116. $inheader = 1;
  117. $globalstats = 0;
  118. LINE: while(<STATS>){
  119.  
  120.     # Skip all lines until individual host stats
  121.     if (/(Global)/) {
  122.         $inheader = 0;
  123.         $globalstats = 1;
  124.     next LINE;
  125.     }
  126.     if ($inheader) {
  127.     next LINE;
  128.     }
  129.  
  130.     if(/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/){
  131.         # Save IP addr
  132.         $Addrpacked = pack('C4', split(/\./, $1));
  133.         $Addrstring = $1;
  134.         next LINE;
  135.     } 
  136.  
  137.     if (/^    /){
  138.         
  139.         # skip global stats line
  140.         if($globalstats){
  141.             $globalstats = 0;
  142.             next LINE;
  143.         }
  144.  
  145.         # Grab stats
  146.         ($RQ, $RR, $RIQ, $RNXD, $RFwdQ, $RFwdR, $RDupQ, $RDupR, $RFail, $RFErr, $RErr, $RTCP, $RAXFR, $RLame, $ROpts, $SSysQ, $SAns, $SFwdQ, $SFwdR, $SDupQ, $SFail, $SFErr, $SErr, $RNotNsQ, $SNaAns, $SNXD) = split(' ', $_, 26);
  147.     } else {
  148.         # Ignore unexpected lines
  149.         next LINE;
  150.     }
  151.  
  152.     # check filter criterea
  153.     if ($All_stats){
  154.         &SHOWSTATS();
  155.         next LINE; 
  156.     }
  157.  
  158.     if (($Lame_delegations || $Error_cases) && ($RLame > $Threshold)){
  159.         &SHOWHOST();
  160.         if($RLame == 1){
  161.             printf "%6d lame delegation\n", $RLame;
  162.         } else {
  163.             printf "%6d lame delegations\n", $RLame;
  164.         }
  165.     }
  166.  
  167.     if ($Error_cases && ($RFail > $Threshold)){
  168.         &SHOWHOST();
  169.         if($RFail == 1){
  170.             printf "%6d server failure response to a query we made\n", $RFail;
  171.         } else {
  172.             printf "%6d server failure responses to queries we made\n", $RFail;
  173.         }
  174.     }
  175.  
  176.     if ($Error_cases && ($RFErr > $Threshold)){
  177.         &SHOWHOST();
  178.         if($RFErr == 1){
  179.             printf "%6d format error response to a query we made\n", $RFErr;
  180.         } else {
  181.             printf "%6d format error responses to queries we made\n", $RFErr;
  182.         }
  183.     }
  184.  
  185.     if ($Error_cases && ($SFErr > $Threshold)){
  186.         &SHOWHOST();
  187.         if($SFErr == 1){
  188.             printf "%6d format error response sent to them\n", $SFErr;
  189.         } else {
  190.             printf "%6d format error responses sent to them\n", $SFErr;
  191.         }
  192.     }
  193.  
  194.     if ($Error_cases && ($SErr > $Threshold)){
  195.         &SHOWHOST();
  196.         if($SErr == 1){
  197.             printf "%6d sendto() call failed\n", $SErr;
  198.         } else {
  199.             printf "%6d sendto() calls failed\n", $SErr;
  200.         }
  201.     }
  202.  
  203.     if ($Uses_this_server && ($RNotNsQ > $Threshold)){
  204.         &SHOWHOST();
  205.         if($RNotNsQ == 1){
  206.             printf "%6d query from a resolver\n", $RNotNsQ;
  207.         } else {
  208.             printf "%6d queries from a resolver\n", $RNotNsQ;
  209.         }
  210.     }
  211.  
  212.     if ($Inverse_query && ($RIQ > $Threshold)){
  213.         &SHOWHOST();
  214.         if($RIQ == 1){
  215.             printf "%6d inverse query\n", $RIQ;
  216.         } else {
  217.             printf "%6d inverse queries\n", $RIQ;
  218.         }
  219.     }
  220.  
  221.     if ($Requested_zone_transfer && ($RAXFR > $Threshold)){
  222.         &SHOWHOST();
  223.         if($RAXFR == 1){
  224.             printf "%6d zone transfer request\n", $RAXFR;
  225.         } else {
  226.             printf "%6d zone transfer requests\n", $RAXFR;
  227.         }
  228.     }
  229. }
  230.  
  231. sub SHOWHOST {
  232.     local($length);
  233.  
  234.     if($By_name){
  235.         ($name, $rest) = gethostbyaddr($Addrpacked, &AF_INET);
  236.         if($name) {
  237.           $host = $name;
  238.         } else {
  239.           $host = $Addrstring;
  240.         }
  241.     } else {
  242.         $host = $Addrstring;
  243.     }
  244.  
  245.     printf "%s\t", $host;
  246.  
  247.     # length is to the first tab boundary
  248.     $length = 8 * (int(length($host)/8) + 1);
  249.  
  250.     if($By_name){
  251.         $Column = 24;
  252.     } else {
  253.         $Column = 16;
  254.     }
  255.     while ($length < $Column) {
  256.         printf "\t";
  257.         $length += 8;
  258.     }
  259. }
  260.  
  261. sub SHOWSTATS {
  262.         &SHOWHOST();
  263.         printf "\n";
  264.  
  265.         if($Column == 24){
  266.             $indent = "\t\t\t";
  267.         } else {
  268.             $indent = "\t\t";
  269.         }
  270.  
  271.         if($RQ > $Threshold){
  272.             if($RQ == 1){
  273.                 printf "%s%6d query\n", $indent, $RQ;
  274.             } else {
  275.                 printf "%s%6d queries\n", $indent, $RQ;
  276.             }
  277.         }
  278.         if($RR > $Threshold){
  279.             if($RR == 1){
  280.                 printf "%s%6d answer\n", $indent, $RR;
  281.             } else {
  282.                 printf "%s%6d answers\n", $indent, $RR;
  283.             }
  284.         }
  285.         if($RIQ > $Threshold){
  286.             if($RIQ == 1){
  287.                 printf "%s%6d inverse query\n", $indent, $RIQ;
  288.             } else {
  289.                 printf "%s%6d inverse queries\n", $indent, $RIQ;
  290.             }
  291.         }
  292.         if($RNXD > $Threshold){
  293.             if($RNXD == 1){
  294.                 printf "%s%6d negative response\n", $indent, $RNXD;
  295.             } else {
  296.                 printf "%s%6d negative responses\n", $indent, $RNXD;
  297.             }
  298.         }
  299.         if($RFwdQ > $Threshold){
  300.             if($RFwdQ == 1){
  301.                 printf "%s%6d query we had to forward\n", $indent, $RFwdQ;
  302.             } else {
  303.                 printf "%s%6d queries we had to forward\n", $indent, $RFwdQ;
  304.             }
  305.         }
  306.         if($RFwdR > $Threshold){
  307.             if($RFwdR == 1){
  308.                 printf "%s%6d response we had to forward\n", $indent, $RFwdR;
  309.             } else {
  310.                 printf "%s%6d responses we had to forward\n", $indent, $RFwdR;
  311.             }
  312.         }
  313.         if($RDupQ > $Threshold){
  314.             if($RDupQ == 1){
  315.                 printf "%s%6d duplicate query\n", $indent, $RDupQ;
  316.             } else {
  317.                 printf "%s%6d duplicate queries\n", $indent, $RDupQ;
  318.             }
  319.         }
  320.         if($RDupR > $Threshold){
  321.             if($RDupR == 1){
  322.                 printf "%s%6d duplicate response\n", $indent, $RDupR;
  323.             } else {
  324.                 printf "%s%6d duplicate responses\n", $indent, $RDupR;
  325.             }
  326.         }
  327.         if($RFail > $Threshold){
  328.             if($RFail == 1){
  329.                 printf "%s%6d server failure response to a query we made\n", 
  330.                                                             $indent, $RFail;
  331.             } else {
  332.                 printf "%s%6d server failure responses to queries we made\n", 
  333.                                                             $indent, $RFail;
  334.             }
  335.         }
  336.         if($RFErr > $Threshold){
  337.             if($RFErr == 1){
  338.                 printf "%s%6d format error response to a query we made\n", 
  339.                                                             $indent, $RFErr;
  340.             } else {
  341.                 printf "%s%6d format error responses to queries we made\n", 
  342.                                                             $indent, $RFErr;
  343.             }
  344.         }
  345.         if($RErr > $Threshold){
  346.             if($RErr == 1){
  347.                 printf "%s%6d error response to a query we made\n", $indent, $RErr;
  348.             } else {
  349.                 printf "%s%6d error responses to queries we made\n", $indent, $RErr;
  350.             }
  351.         }
  352.         if($RTCP > $Threshold){
  353.             if($RTCP == 1){
  354.                 printf "%s%6d query using TCP instead of UDP\n", $indent, $RTCP;
  355.             } else {
  356.                 printf "%s%6d queries using TCP instead of UDP\n", $indent, $RTCP;
  357.             }
  358.         }
  359.         if($RAXFR > $Threshold){
  360.             if($RAXFR == 1){
  361.                 printf "%s%6d zone transfer request\n", $indent, $RAXFR;
  362.             } else {
  363.                 printf "%s%6d zone transfer requests\n", $indent, $RAXFR;
  364.             }
  365.         }
  366.         if($RLame > $Threshold){
  367.             if($RLame == 1){
  368.                 printf "%s%6d lame delegation\n", $indent, $RLame;
  369.             } else {
  370.                 printf "%s%6d lame delegations\n", $indent, $RLame;
  371.             }
  372.         }
  373.         if($ROpts > $Threshold){
  374.             if($ROpts == 1){
  375.                 printf "%s%6d response with IP options\n", $indent, $ROpts;
  376.             } else {
  377.                 printf "%s%6d responses with IP options\n", $indent, $ROpts;
  378.             }
  379.         }
  380.         if($SSysQ > $Threshold){
  381.             if($SSysQ == 1){
  382.                 printf "%s%6d system query sent to them\n", $indent, $SSysQ;
  383.             } else {
  384.                 printf "%s%6d system queries sent to them\n", $indent, $SSysQ;
  385.             }
  386.         }
  387.         if($SAns > $Threshold){
  388.             if($SAns == 1){
  389.                 printf "%s%6d response sent to them\n", $indent, $SAns;
  390.             } else {
  391.                 printf "%s%6d responses sent to them\n", $indent, $SAns;
  392.             }
  393.         }
  394.         if($SFwdQ > $Threshold){
  395.             if($SFwdQ == 1){
  396.                 printf "%s%6d query forwarded to them\n", $indent, $SFwdQ;
  397.             } else {
  398.                 printf "%s%6d queries forwarded to them\n", $indent, $SFwdQ;
  399.             }
  400.         }
  401.         if($SFwdR > $Threshold){
  402.             if($SFwdR == 1){
  403.                 printf "%s%6d response forwarded to them\n", $indent, $SFwdR;
  404.             } else {
  405.                 printf "%s%6d responses forwarded to them\n", $indent, $SFwdR;
  406.             }
  407.         }
  408.         if($SDupQ > $Threshold){
  409.             if($SDupQ == 1){
  410.                 printf "%s%6d duplicate query sent to them\n", $indent, $SDupQ;
  411.             } else {
  412.                 printf "%s%6d duplicate queries sent to them\n", $indent, $SDupQ;
  413.             }
  414.         }
  415.         if($SFail > $Threshold){
  416.             if($SFail == 1){
  417.                 printf "%s%6d server failure response sent to them\n", $indent, $SFail;
  418.             } else {
  419.                 printf "%s%6d server failure responses sent to them\n", $indent, $SFail;
  420.             }
  421.         }
  422.         if($SFErr > $Threshold){
  423.             if($SFErr == 1){
  424.                 printf "%s%6d format error response sent to them\n", $indent, $SFErr;
  425.             } else {
  426.                 printf "%s%6d format error responses sent to them\n", $indent, $SFErr;
  427.             }
  428.         }
  429.         if($SErr > $Threshold){
  430.             if($SErr == 1){
  431.                 printf "%s%6d sendto() call failed\n", $indent, $SErr;
  432.             } else {
  433.                 printf "%s%6d sendto() calls failed\n", $indent, $SErr;
  434.             }
  435.         }
  436.         if($RNotNsQ > $Threshold){
  437.             if($RNotNsQ == 1){
  438.                 printf "%s%6d query from a resolver\n", $indent, $RNotNsQ;
  439.             } else {
  440.                 printf "%s%6d queries from a resolver\n", $indent, $RNotNsQ;
  441.             }
  442.         }
  443.         if($SNaAns > $Threshold){
  444.             if($SNaAns == 1){
  445.                 printf "%s%6d query answered from our cache\n", $indent, $SNaAns;
  446.             } else {
  447.                 printf "%s%6d queries answered from our cache\n", $indent, $SNaAns;
  448.             }
  449.         }
  450.         if($SNXD > $Threshold){
  451.             if($SNXD == 1){
  452.                 printf "%s%6d negative response sent to them\n", $indent, $SNXD;
  453.             } else {
  454.                 printf "%s%6d negative responses sent to them\n", $indent, $SNXD;
  455.             }
  456.         }
  457. }
  458.  
  459. sub PARSEARGS {
  460.     local(@args) = @_;
  461.     local($i);
  462.  
  463.     $i = 0;
  464.     while ($i <= $#args){
  465.     $option = $args[$i];
  466.     if($option eq "-f"){
  467.             $Stats_file1 = $args[++$i];
  468.         } elsif ($option eq "-a") {
  469.             $All_stats = 1;
  470.         } elsif ($option eq "-e") {
  471.             $Error_cases = 1;
  472.         } elsif ($option eq "-i") {
  473.             $Inverse_query = 1;
  474.         } elsif ($option eq "-l") {
  475.             $Lame_delegations = 1;
  476.         } elsif ($option eq "-n") {
  477.             $By_name = 0;
  478.         } elsif ($option eq "-t") {
  479.             $Threshold = $args[++$i];
  480.         } elsif ($option eq "-u") {
  481.             $Uses_this_server = 1;
  482.         } elsif ($option eq "-z") {
  483.             $Requested_zone_transfer = 1;
  484.     } else {
  485.         if($option =~ /^-.*/){
  486.         print STDERR "Unknown option: $option ... ignored.\n";
  487.         }
  488.     }
  489.     $i++;
  490.     }
  491.     
  492. }
  493.  
  494.